1 REM ONE VOICE PLAYER (FAST) 2 REM PLAYS "MEXICAN HAT DANCE" 3 REM 5 PRINT"[147]":POKE53280,0:POKE53281,6 7 PRINT:PRINT" ONE VOICE PLAYER" 8 PRINT:PRINT" MEXICAN HAT DANCE..." 10 GOSUB 9000:GOTO 120 60 FOR N=1 TO LEN(MD$(PH)) 61 D%=VAL(MID$(MD$(PH),N,1)) 64 POKE GR,UG%:REM NORMAL NOTES; DELETE POKES FOR LEGATO 65 FOR I=0 TO 1:POKE FR(I),PI%(ASC(MID$(ME$(PH),N,1)),I):NEXT 66 POKE GR,G% 67 FOR I=0 TO DU%(VAL(MID$(MD$(PH),N,1))):NEXT 68 REM POKE GR,UG%:REM STACCATO NOTES 69 NEXT:PH=PH+1:IF PH>ES% THEN PH=0 70 POKE GR,UG:RETURN 100 GOSUB 60 110 IF PEEK(653)>0 THEN END 120 PRINT "PHRASE "PH 190 GOTO 100 8997 REM 8998 REM SET UP SOUND SHAPE 8999 REM 9000 DIM MV$(23),MD$(23),ME$(23),FR(1) 9001 DIM DU%(9),PI%(168,1) 9007 REM 9008 REM ATTACK 9009 REM NUMBER FROM 0 TO 15; LOWER NUMBER=SHARPER ATTACK 9010 AK%=0 9015 AK%=AK%*16 9017 REM 9018 REM DECAY 9019 REM NUMBER FROM 0 TO 15; LOWER NUMBER=FASTER DECLINE 9020 DY%=5 9027 REM 9028 REM SUSTAIN 9029 REM NUMBER FROM 0 TO 15; LOWER NUMBER=SOFTER VOLUME DURING SUSTAIN 9030 SN%=1 9035 SN%=SN%*16 9037 REM 9038 REM RELEASE 9039 REM NUMBER FROM 0 TO 15; LOWER NUMBER=FASTER DROP TO SILENCE AT END 9040 RE%=0 9047 REM 9048 REM SET SOUND ADDRESSES 9049 REM 9050 FR(0)=54272 9055 FR(1)=1+FR(0):GR=FR(0)+4:AD=GR+1 9057 REM 9058 REM POKE ADSR ENVELOPE 9059 REM 9060 POKE AD,AT% OR DY% 9065 POKE AD+1,SN% OR RE% 9066 REM 9067 REM SET UP GATE 9068 REM WAVEFORMS (ADD VALUES): 9069 REM TRIANGLE ON=16; SAWTOOTH ON=32; PULSE ON=64 (SET WIDTH!); NOISE ON=128 9070 WF%=32 9075 G%=1 OR WF%:UG%=G% AND 254 9077 REM 9078 REM SET PULSE WIDTH 9079 REM LOW BYTE, HIGH BYTE 9080 POKE GR-2,200:POKE GR-1,3 9096 REM 9097 REM SET UP PITCH ARRAY 9098 REM EACH NOTE, IN ALL ITS OCTAVES 9099 REM C 9100 X%=3:GOSUB 9190 9101 DATA 12,1,24,2,48,4,97,8,195,16,135,33,15,67,30,134 9102 REM D 9103 X%=4:GOSUB 9190 9104 DATA 45,1,90,2,180,4,104,9,209,18,162,37,69,75,139,150 9105 REM E (F-FLAT) 9106 X%=5:GOSUB 9190:Y%=13:GOSUB 9195 9107 DATA 81,1,163,2,71,5,143,10,31,21,62,42,125,84,250,168 9108 REM F (E-SHARP) 9109 X%=6:GOSUB 9190:Y%=19:GOSUB 9195 9110 DATA 102,1,204,2,152,5,48,11,96,22,193,44,131,89,6,179 9111 REM G 9112 X%=7:GOSUB 9190 9113 DATA 145,1,35,3,71,6,143,12,30,25,60,50,121,100,243,200 9114 REM A 9115 X%=1:GOSUB 9190 9116 DATA 195,1,134,3,12,7,24,14,49,28,99,56,199,112,143,225 9117 REM B 9118 X%=2:GOSUB 9190 9119 DATA 250,1,244,3,233,7,210,15,165,31,75,63,151,126,46,253 9120 REM D-FLAT (C-SHARP) 9121 X%=11:GOSUB 9190:Y%=17:GOSUB 9195 9122 DATA 28,1,56,2,112,4,225,8,195,17,134,35,12,71,24,142 9123 REM E-FLAT (D-SHARP) 9124 X%=12:GOSUB 9190:Y%=18:GOSUB 9195 9125 DATA 62,1,125,2,251,4,247,9,239,19,223,39,191,79,126,159 9126 REM G-FLAT (F-SHARP) 9127 X%=14:GOSUB 9190:Y%=20:GOSUB 9195 9128 DATA 123,1,246,2,237,5,218,11,181,23,107,47,214,94,172,189 9129 REM A-FLAT (G-SHARP) 9130 X%=8:GOSUB 9190:Y%=21:GOSUB 9195 9131 DATA 169,1,83,3,167,6,78,13,156,26,57,53,115,106,230,212 9132 REM B-FLAT (A-SHARP) 9133 X%=9:GOSUB 9190:Y%=15:GOSUB 9195 9134 DATA 221,1,187,3,119,7,239,14,223,29,190,59,124,119,248,238 9135 REM C-FLAT 9136 X%=10:GOSUB 9190 9137 DATA 4,1,250,1,244,3,233,7,210,15,165,31,75,63,151,126 9138 REM B-SHARP 9139 X%=16:GOSUB 9190 9140 DATA 24,2,48,4,97,8,195,16,135,33,15,67,30,134,255,255 9150 FOR I=0 TO 147 STEP 21:PI%(I,0)=0:PI%(I,1)=0:NEXT 9185 GOTO 9200 9189 REM READ PITCHES 9190 FOR I=0 TO 147 STEP 21:READ PI%(I+X%,0),PI%(I+X%,1):NEXT:RETURN 9194 REM IDENTICAL PITCHES 9195 FOR I=0 TO 147 STEP 21:PI%(I+Y%,0)=PI%(I+X%,0):PI%(I+Y%,1)=PI%(I+X%,1) 9196 NEXT:RETURN 9197 REM 9198 REM SET UP DURATIONS 9199 REM 9200 FOR I=0 TO 9:READ DU%(I):NEXT 9205 DATA 16,32,48,64,96,128,160,192,256,320 9296 REM 9297 REM SET FILTER AND VOLUME 9298 REM FILTER FREQUENCY 9299 REM LOW BYTE (0-7) X%; HIGH BYTE (0-255) Y% 9300 X%=0:Y%=100 9305 POKE 54293,X%:POKE 54294,Y% 9308 REM FILTER ON? 9309 REM VOICE 1 ON=1 9310 X%=0 9318 REM FILTER RESONANCE 9319 REM PEAK VOLUME (0=LOW, 15=HIGH) 9320 Y%=14 9325 Y%=Y%*16:POKE 54295,X% OR Y% 9328 REM SELECT FILTER TYPE 9329 REM LOW-PASS=1;BAND-PASS=2;HIGH-PASS=4;LO-BAND=3;HI-BAND=6;ALL=7 9330 X%=1 9335 X%=X%*16 9337 REM 9338 REM SELECT OVERALL VOLUME 9339 REM 15=HIGH, 0=LOW 9340 Y%=15 9345 POKE 54296,X% OR Y% 9496 REM 9497 REM SET MELODY 9498 REM 9509 REM HOW MANY PHRASES? (MINUS ONE) 9510 ES%=5 9514 REM 9515 REM MELODY STRINGS 9516 REM 9517 REM EACH PHRASE HAS ONLY ONE DU%(PH%) STRING, NO MATTER HOW MANY VOICES 9518 REM EACH PHRASE HAS ONE ME$(PH%,VC%) & ONE MV$(PH%,VC%) STRING PER VOICE 9519 REM PHRASE 0 9520 MD$(0)="00000000040000000004" 9521 ME$(0)="G[198]GE[196]ECBCGEFGABCDEFD" 9522 MV$(0)="6 565 6 " 9529 REM PHRASE 1 9530 MD$(1)="0000000004000000006" 9531 ME$(1)="FEFD[195]DB[193]BGG[198]GAGFEDC" 9532 MV$(1)="6 5 6 " 9539 REM PHRASE 2 9540 MD$(2)="000000015000000015" 9541 ME$(2)="GC@GC@GC@GCDCB@CD@" 9542 MV$(2)="34 34 34 34 3 4 " 9549 REM PHRASE 3 9550 MD$(3)="000000015000000015" 9551 ME$(3)="GB@GB@GB@GBCBA@BC@" 9552 MV$(3)="3 43 4 " 9559 REM PHRASE 4 9560 MD$(4)="11111111151111111115" 9561 ME$(4)="DDDAAACCCBDDDAAACCCB" 9562 MV$(4)="5 4 5 45 4 5 4" 9569 REM PHRASE 5 9570 MD$(5)="1111111115111111118" 9571 ME$(5)="DDDAAACCCBD[195]DEDCBAG" 9572 MV$(5)="5 4 5 45 4 " 9898 REM CONVERT STRINGS TO USABLE FORM 9899 REM 9900 FOR PH=0 TO ES% 9905 A$=ME$(PH):ME$(PH)="" 9910 FOR I=1 TO LEN(A$) 9920 X%=ASC(MID$(A$,I,1)) 9930 IF X%<72 THEN X%=X%-64:IF X%<0 THEN X%=0 9931 IF X%>192AND X%<200 THEN X%=X%-178 9932 IF X%=176 THEN X%=8 9933 IF X%=191 THEN X%=9 9934 IF X%=188 THEN X%=10 9935 IF X%=172 THEN X%=11 9936 IF X%=177 THEN X%=12 9937 IF X%=187 THEN X%=13 9938 IF X%=165 THEN X%=14 9939 IF X%>21 THEN X%=0 9940 V$=MID$(MV$(PH),I,1):IF V$<>" " THEN Y%=21*VAL(V$) 9950 X%=X%+Y% 9970 ME$(PH)=ME$(PH)+CHR$(X%) 9975 NEXT:NEXT 9980 PH=0 9990 RETURN